package com.kitty.record.kittyjava.javaproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description
 * @Author SHEN
 * @Date 2021/1/19
 */
public class JdkProxy {

    public static void main(String[] args) {

        //实例化对象可以使用反射的方式，一般框架中都是使用种方式；
        CaiXuKun caiXuKun = new CaiXuKun();
        LiuDeHua liuDeHua = new LiuDeHua();

        //参数解析：Star.class.getClassLoader()=》类加载器；
        // new Class<?>[]{Star.class}=》接口列表；
        // (proxy, method, arg) -> {
        //            return invoke;
        // }   =》使用lambda表达式的匿名内部类，一般会写一个handler类继承接口实现，此处为了方便演示
        /*Star o = (Star) Proxy.newProxyInstance(Star.class.getClassLoader(),
                new Class<?>[]{Star.class},
                (proxy, method, arg) -> {
                    //method对象调用invoke方法返回的对象就是被代理对象方法的返回值；
                    Object invoke = method.invoke(liuDeHua, arg);
                    if(method.getName().equals("sing")){
                        System.out.println("我还会rap");
                    }
                    return invoke;
                });
        o.sing();
        o.dance();*/
    }
}
//明星接口
interface Star{
    //唱歌
    public String sing();
    //跳舞
    public void dance();

}
class CaiXuKun implements Star{
    @Override
    public String sing() {
        System.out.println("我是蔡徐坤，我会唱歌");
        return "123";
    }
    @Override
    public void dance() {
        System.out.println("我是蔡徐坤，我会跳舞");
    }
}

class LiuDeHua implements Star{
    @Override
    public String sing() {
        System.out.println("我是刘德华，我会唱歌");
        return "456";
    }
    @Override
    public void dance() {
        System.out.println("我是刘德华，我会跳舞");
    }
}


